package com.atjava.nebula.core.dao.dialect;

import java.math.BigDecimal;
import java.math.BigInteger;

public class OracleDialect implements Dialect {

	protected static final String SQL_END_DELIMITER = ";";	
	
	public String getLimitString(String sql, int offset, int limit,
			Object[] parameters) {
		sql = setParam(sql,parameters);
		//parameters=null;
		sql = trim(sql);
		StringBuffer sb = new StringBuffer();
		sb.append("SELECT * ");
		sb.append("FROM( SELECT ROWNUM RN,TA.* FROM( ");
		sb.append(sql);
		sb.append(" )TA WHERE ROWNUM <=");
		sb.append(limit+offset);
		sb.append(" )WHERE RN > ");
		sb.append(offset);
		System.out.println(sb.toString());
		return sb.toString();
	}

	public boolean supportsLimit() {
		return true;
	}

	/**把所有参数直接转移成最终的Sql语句
	 * @param sql
	 * @param parameters
	 * @return
	 */
	private String setParam(String sql , Object[]parameters){
		if(parameters.length>0){
			String []sqlSect=sql.split("\\?");
			StringBuilder sqlStr=new StringBuilder();
			for(int i=0 ; i< parameters.length ; i++){
				sqlStr.append(sqlSect[i]);
				Object para=parameters[i];
				if(		   para instanceof Integer 
						|| para instanceof Double
						|| para instanceof BigDecimal
						|| para instanceof BigInteger
						|| para instanceof Float)
					sqlStr.append(para.toString());
				else if(para instanceof Boolean){
					if((Boolean)para)
						sqlStr.append("1");
					else
						sqlStr.append("0");
				}
				else //其它类型（包括日期型），都加上单引号
					sqlStr.append("'").append(para.toString()).append("'");
				parameters[i]=null;
					
			}
			sqlStr.append(sqlSect[sqlSect.length-1]);
			return sqlStr.toString();
		}
		else
		{
			return sql;
		}
	}
	
	private String trim(String sql) {
		sql = sql.trim();
		if (sql.endsWith(SQL_END_DELIMITER)) {
			sql = sql.substring(0, sql.length() - 1
					- SQL_END_DELIMITER.length());
		}
		return sql;
	}


}
